package cn.song.freight.domain.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * 添加操作日志请求参数
 *
 * @author SongRenShuo
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "添加操作日志请求参数")
public class OperationLogAddDTO {

    /**
     * 链路追踪ID，用于关联同一次操作的多条日志
     */
    @NotBlank(message = "链路追踪ID不能为空")
    @ApiModelProperty(value = "链路追踪ID，用于关联同一次操作的多条日志", required = true)
    private String traceId;

    /**
     * 模块类型
     * @see cn.song.freight.enums.ModuleType
     */
    @NotBlank(message = "模块类型不能为空")
    @ApiModelProperty(value = "模块类型：AREA(区域管理)、FREIGHT_STRATEGY(运费策略)等", required = true)
    private String moduleType;

    /**
     * 操作类型
     * @see cn.song.freight.enums.OperationType
     */
    @NotBlank(message = "操作类型不能为空")
    @ApiModelProperty(value = "操作类型：INSERT(新增)、UPDATE(修改)、DELETE(删除)等", required = true)
    private String operationType;

    /**
     * 业务ID，关联的业务记录主键，多个ID用逗号分隔
     */
    @ApiModelProperty(value = "业务ID，关联的业务记录主键，多个ID用逗号分隔")
    private String businessId;

    /**
     * 业务名称或描述
     */
    @ApiModelProperty(value = "业务名称或描述")
    private String businessName;

    /**
     * 操作描述，详细说明本次操作的内容
     */
    @ApiModelProperty(value = "操作描述，详细说明本次操作的内容")
    private String operationDescription;

    /**
     * 操作前数据，JSON格式存储
     */
    @ApiModelProperty(value = "操作前数据，JSON格式存储")
    private String beforeData;

    /**
     * 操作后数据，JSON格式存储
     */
    @ApiModelProperty(value = "操作后数据，JSON格式存储")
    private String afterData;

    /**
     * 变更字段列表，JSON格式存储字段名和变更情况
     */
    @ApiModelProperty(value = "变更字段列表，JSON格式存储字段名和变更情况")
    private String changedFields;

    /**
     * 请求参数，JSON格式存储
     */
    @ApiModelProperty(value = "请求参数，JSON格式存储")
    private String requestParams;

    /**
     * 响应结果，JSON格式存储接口返回的code、msg等信息
     */
    @ApiModelProperty(value = "响应结果，JSON格式存储接口返回的code、msg等信息")
    private String responseResult;

    /**
     * 请求方法：GET、POST、PUT、DELETE
     */
    @ApiModelProperty(value = "请求方法：GET、POST、PUT、DELETE")
    private String requestMethod;

    /**
     * 请求URL
     */
    @ApiModelProperty(value = "请求URL")
    private String requestUrl;

    /**
     * 请求IP地址
     */
    @ApiModelProperty(value = "请求IP地址")
    private String requestIp;

    /**
     * 用户代理信息
     */
    @ApiModelProperty(value = "用户代理信息")
    private String userAgent;

    /**
     * 操作人
     */
    @NotBlank(message = "操作人不能为空")
    @ApiModelProperty(value = "操作人", required = true)
    private String operator;

    /**
     * 执行耗时（毫秒）
     */
    @ApiModelProperty(value = "执行耗时（毫秒）")
    private Integer executionTime;

    /**
     * 操作状态：1-成功，2-失败
     */
    @NotNull(message = "操作状态不能为空")
    @ApiModelProperty(value = "操作状态：1-成功，2-失败", required = true)
    private Integer status;

    /**
     * 错误信息，操作失败时记录
     */
    @ApiModelProperty(value = "错误信息，操作失败时记录")
    private String errorMessage;
}
